﻿'''
题目描述
入职后，导师会请你吃饭，你选择了火锅。
火锅里会在不同时间下很多菜。
不同食材要煮不同的时间，才能变得刚好合适。
你希望吃到最多的刚好合适的菜，但你的手速不够快，用m代表手速，每次下手捞菜后至少要过m秒才能再捞（每次只能捞一个）。
那么用最合理的策略，最多能吃到多少刚好合适的菜？
输入描述
第一行两个整数n，m，其中n代表往锅里下的菜的个数，m代表手速。（1 < n, m < 1000）
接下来有n行，每行有两个数x，y代表第x秒下的菜过y秒才能变得刚好合适。（1 < x, y < 1000）
输出描述
输出一个整数代表用最合理的策略，最多能吃到刚好合适的菜的数量。
示例1
输入
2 1
1 2
2 1
输出
1
说明
解题思路
题目的核心是在多个可能的捞菜时刻中，通过合理安排选择，尽可能多地吃到“刚好合适”的菜。考虑到每次捞菜后的冷却时间，需要
设计一个策略，尽量避开同时煮熟的菜以最大化收益。
菜的描述：
有 n 个菜依次被放入火锅，每个菜放入的时间和煮熟的时间不同。
每个菜从放入到煮熟需要特定的时间，具体描述为：在第 x 秒放入的菜需要煮 y 秒后才能达到刚好合适的状态。
手速限制：
你每次只能捞一个菜，捞完一个菜后由于手速限制，需要等待 m 秒后才能再次捞下一个菜。
目标：
在限制条件下（每次捞菜需要等待 m 秒），最大化吃到刚好合适的菜的数量。
用例解释
输入：
2 1
1 2
2 1
解析：
总共有 2 个菜（n = 2），你的手速需要 1 秒的冷却时间（m = 1）。
第一个菜在第 1 秒放入，需要 2 秒才能煮熟，所以这个菜在第 3 秒刚好煮熟。
第二个菜在第 2 秒放入，需要 1 秒煮熟，所以在第 3 秒刚好煮熟。
输出：
1
解释：
两个菜都在第 3 秒刚好煮熟，但你在第 3 秒只能捞一个，因为你捞完一个菜后要等 1 秒才能捞下一个菜。
因此，你最多只能捞到其中一个刚好合适的菜，所以输出 1。
'''
#输入描述
#第一行两个整数n，m，其中n代表往锅里下的菜的个数，m代表手速。（1 < n, m < 1000）
#接下来有n行，每行有两个数x，y代表第x秒下的菜过y秒才能变得刚好合适。（1 < x, y < 1000）
#输出描述
#输出一个整数代表用最合理的策略，最多能吃到刚好合适的菜的数量。

#读取输入
n,m = map(int,input().split())
end_times = []
for _ in range(n):
    start_time,conti_time = map(int,input().split())
    end_time = start_time + conti_time
    end_times.append(end_time)
#记录每个时间点是否有菜
nums = [0] * (max(end_times) + 1)
for t in end_times:
    nums[t] = 1
result = []     #用来存储每种策略下能吃到菜的数量的列表

def dfs(t,data):  #深度优先搜索函数，t表示当前时间点，data表示当前策略下已经吃到的菜的数量
    if t > max(end_times):
        result.append(sum(data))    #将当前策略下吃到的菜的数量加入结果列表中
        return
    if nums[t] == 1:    #当前时间点有菜
        dfs(t + m, data + [1])  #捞菜，data数量加1
        dfs(t + 1,data) # 不捞菜，继续搜索下一个时间点
    else:   #当前没菜
        dfs(t + 1, data)    #继续搜索下一个时间点

dfs(1,[])
print(max(result))
